/**
值类型和引用类型
(1)int、float、bool 和 string 这些基本类型都属于值类型，使用这些类型的
  变量直接指向存在内存中的值
(2)当使用等号 = 将一个变量的值赋值给另一个变量时，如：j = i，实际上是
  在内存中将 i 的值进行了拷贝
(3)通过 &i 来获取变量 i 的内存地址，例如：0xf840000040（每次的地址都可能不一样）。
  值类型的变量的值存储在栈中。
(4)一个引用类型的变量 r1 存储的是 r1 的值所在的内存地址（数字），或内存地址中第一个字
  所在的位置
(5)同一个引用类型的指针指向的多个字可以是在连续的内存地址中（内存布局是连续的），也可以将这些字分散存放在内存中，
  每个字都指示了下一个字所在的内存地址。
  当使用赋值语句 r2 = r1 时，只有引用（地址）被复制。
  如果 r1 的值被改变了，那么这个值的所有引用都会指向被修改后的内容，在这个例子中，r2 也会受到影响。
(6)使用 := 赋值操作符
  变量的初始化时省略变量的类型而由系统自动推断，声明语句写上 var 关键字其实是显得有些多余了，因此我们可以将它们简写为 a := 50 
  或 b := false。
  a 和 b 的类型（int 和 bool）将由编译器自动推断。
  这是使用变量的首选形式，但是它只能被用在函数体内，而不可以用于全局变量的声明与赋值。使用操作符 := 可以高效地
  创建一个新的变量，称之为初始化声明。
*/


  package main

  import "fmt"

  func main() {
  	var a string = "abc"
  	//局部变量
  	//单纯给a赋值是不够的，这个值必须被使用
  	//fmt.Println("hello,i am blake!\n")
  	fmt.Println("hello,i am blake!\n",a)

  	//全局变量
  	//但是全局变量是允许声明但不使用。 同一类型的多个变量可以声明在同一行
  	//var a, b, c int
  	//多变量可以在同一行进行赋值
  	/**var a, b int
       var c string
       a, b, c = 5, 7, "abc"
     
     以上等价于 a, b, c := 5, 7, "abc"

     右边的这些值以相同的顺序赋值给左边的变量，所以 a 的值是 5， b 的值是 7，c 的值是 "abc"。

     这被称为 并行 或 同时 赋值。

     如果你想要交换两个变量的值，则可以简单地使用 a, b = b, a，两个变量的类型必须是相同。

     空白标识符 _ 也被用于抛弃值，如值 5 在：_, b = 5, 7 中被抛弃。

     _ 实际上是一个只写变量，你不能得到它的值。这样做是因为 Go 语言中你必须使用所有被声明的变量，但
     有时你并不需要使用从一个函数得到的所有返回值。

     并行赋值也被用于当一个函数返回多个返回值时，比如这里的 val 和错误 err 是通过调用 Func1 函数同时
     得到：val, err = Func1(var1)。
     */
  }